home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / sort / Source / quicker.c < prev    next >
C/C++ Source or Header  |  1992-10-15  |  2KB  |  78 lines

  1. #include "sortdata.h"
  2.  
  3. typedef struct {
  4.     long* sortdata;
  5.     swp sw;
  6.     short *stopflag;
  7.     cmp cm;
  8.     long sp;
  9.     long sep;
  10.     long *plv;
  11.     long *phv;
  12. } quicker_static, *pquicker_static;
  13.  
  14. void main(long maxdata, long* sortdata, swp sw, cmp cm, short* stopflag);
  15. pascal void doquicker(long startvalue, long endvalue, pquicker_static quickptr);
  16.  
  17. void main(long maxdata, long* sdata, swp swpf, cmp cmpf, short* stflag)
  18. {
  19.     quicker_static quick;
  20.     
  21.  
  22.     quick.sortdata = sdata;
  23.     quick.sw = swpf;
  24.     quick.cm = cmpf;
  25.     quick.stopflag = stflag;
  26.     doquicker(0, maxdata -1, &quick);
  27. }
  28.  
  29. pascal void doquicker(long startvalue, long endvalue, pquicker_static quickptr)
  30. {
  31.     long lv,hv;
  32.  
  33.     lv = startvalue;
  34.     hv = endvalue;
  35.  
  36.     quickptr->plv = &(quickptr->sortdata[lv]);
  37.     quickptr->phv = &(quickptr->sortdata[hv]);
  38.     quickptr->sp = (startvalue+endvalue)>>1;
  39.     quickptr->sep = quickptr->sortdata[quickptr->sp];
  40.  
  41.     do {
  42.         while ((lv != quickptr->sp) && ((*(quickptr->cm))(lv, quickptr->sp, *(quickptr->plv), quickptr->sep) < 0)) {
  43.             if (*(quickptr->stopflag)) {
  44.                 return;
  45.             }
  46.             lv++;
  47.             quickptr->plv++;
  48.         }
  49.  
  50.         while ((hv != quickptr->sp) && ((*(quickptr->cm))(hv, quickptr->sp, *(quickptr->phv), quickptr->sep) > 0)) {
  51.             if (*(quickptr->stopflag)) {
  52.                 return;
  53.             }
  54.             hv--;
  55.             quickptr->phv--;
  56.         }
  57.  
  58.         if (lv <= hv) {
  59.             if ((*(quickptr->cm))(lv, hv, *(quickptr->plv), *(quickptr->phv)) > 0) {
  60.                 (*(quickptr->sw))(lv, hv, quickptr->plv, quickptr->phv);
  61.             }
  62.             lv++;
  63.             quickptr->plv++;
  64.             hv--;
  65.             quickptr->phv--;
  66.         }
  67.     } while (lv <= hv);
  68.  
  69.     if (startvalue < hv) {
  70.         doquicker(startvalue, hv, quickptr);
  71.     }
  72.  
  73.     if (endvalue > lv) {
  74.         doquicker(lv, endvalue, quickptr);
  75.     }
  76. }
  77.  
  78.